//这是一个路由模块
import Vue from  "vue"
import VueRouter from "vue-router"
//注册路由
Vue.use(VueRouter)

// 原型上修改push方法
const originPush = VueRouter.prototype.push  // 先将之前的存储到一个变量当中
const originReplace = VueRouter.prototype.replace // 同上

// 修改VueRouter原型上的push 用于解决重复跳转时报错的问题
VueRouter.prototype.push = function(location,okCallBack,errCallBack){
  if(okCallBack === undefined && errCallBack === undefined){
    // 上面的判断成立的话，表示没有传递这两个参数
    originPush.call(this,location).catch(()=>{})  // 统一处理报错的问题 一劳永逸
  }else {
    originPush.call(this,location,okCallBack,errCallBack)
  }
}

// 修改VueRouter原型上的replace 用于解决重复跳转时报错的问题
VueRouter.prototype.replace = function(location,okCallBack,errCallBack){
  if(okCallBack === undefined && errCallBack === undefined){
    // 上面的判断成立的话，表示没有传递这两个参数
    originReplace.call(this,location).catch(()=>{})  // 统一处理报错的问题 一劳永逸
  }else {
    originReplace.call(this,location,okCallBack,errCallBack)
  }
}


import routes from "@/router/routes"
import VueLazyload from 'vue-lazyload'
import store from "@/store"
// 3. 书写路由规则  router是路由对象 相当于是一个物件 类似于路由器那个硬件
const router = new VueRouter({
  mode: 'history',
  // routes 加了s了是一个复数形式 表示是多个路由规则对象 相当于是路由器硬件上的网口
  routes,
  scrollBehavior(to, from, savedPosition) {
    if (savedPosition) {
      return savedPosition
    } else {
      return { x: 0, y: 0 }
    }
}
})
//定义前置的路由的守卫
const whiteList=[
  'home',
  'login',
  'register',
  'search',
  'detail',
  'addcartsuccess',
  'shopcart'
]
router.beforeEach((to,from,next)=>{
  if(whiteList.includes(to.name)||store.state.user.userInfo.token){
    next()
    return;
  }
  next({
    name:'login',
    //记录用户想去的界面
    query:{
      redirect:to.path
    }
  })
})
// 4. 导出路由对象
export default router